home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 21
/
Aminet 21 (1997)(GTI - Schatztruhe)[!][Oct 1997].iso
/
Aminet
/
util
/
rexx
/
rxlistview15.lha
/
rxlistview
/
RXLISTVIEW.proc
next >
Wrap
Text File
|
1997-08-15
|
6KB
|
180 lines
/*
** $VER: RXLISTVIEW.proc 1.5 (15.8.97) Rolf Rotvel
**
** Usage: num = listview(width, height, titletext)
**
** The stem variable, viewline, must have the following format:
** viewline.0 = number of elements
** viewline.1 = first element
** viewline.2 = second element...
**
** Returns number of selected element or 0 if requester was cancelled.
*/
RXLISTVIEW: procedure expose viewline. rxlv.
parse arg argwidth, argheight, titletxt
/* Initialize when listview is opened for the first time */
if rxlv.init? ~= 1 then call init_rxlistview(argwidth, argheight)
/* Create formatted stem variable for listview */
do v = 1 to viewline.0
displine.v = left(viewline.v, rxlv.dispcols)
end
displine.0 = viewline.0
/* Which is bigger - win rows or lines in stemvar? */
if rxlv.disprows > displine.0 then rxlv.disprows = displine.0
/* Get current mouse coordinates */
intui = showlist(l, 'intuition.library',, a)
call forbid
screen = next(intui, 56) /* IntuitionBase->ActiveScreen */
mousex = c2d(import(offset(screen, 18), 2)) - 50 /* Screen->MouseX */
mousey = c2d(import(offset(screen, 16), 2)) - 50 /* Screen->MouseY */
call permit
/* Open the listview */
call open('listwin', 'RAW:'||mousex||'/'||mousey||'/'||rxlv.width||'/'||rxlv.height||'/'||titletxt||'/NOSIZE', 'w')
call writech('listwin', rxlv.nocursor||rxlv.nowordwrap)
/* Do ze stuff */
row = 1 ; var = row
call writech('listwin', getlighty(row, var)||rxlv.nl||getpage(var + 1))
res = '' ; topvar = 1
do forever
oldrow = row ; oldvar = var
char = readch('listwin', 1)
select
when char = rxlv.csi then do
char = readch('listwin', 1)
select
when char = rxlv.cursordown & oldvar ~= displine.0 then do
line = getunlighty(oldrow, oldvar)
var = var + 1
if oldrow < rxlv.disprows then row = row + 1
else do
line = line||rxlv.nl
row = rxlv.disprows
topvar = topvar + 1
end
call writech('listwin', line||getlighty(row, var))
end
when char = rxlv.cursorup & oldvar ~= 1 then do
line = getunlighty(oldrow, oldvar)
var = var - 1
if oldrow ~= 1 then do
row = row - 1
call writech('listwin', line||getlighty(row, var))
end
else do
row = 1
topvar = topvar - 1
call writech('listwin', line||getlighty(row, var)||rxlv.nl||getpage(var + 1))
end
end
when char = rxlv.scursorup & oldvar ~= 1 then do
row = 1
if oldrow = 1 then do
if oldvar - rxlv.disprows < 1 then topvar = 1
else topvar = oldvar - rxlv.disprows
var = topvar
call writech('listwin', rxlv.cls||getlighty(row, var)||rxlv.nl||getpage(topvar + 1))
end
else do
var = topvar
call writech('listwin', getunlighty(oldrow, oldvar)||getlighty(row, var))
end
end
when char = rxlv.scursordown & oldvar ~= displine.0 then do
row = rxlv.disprows
if oldrow = rxlv.disprows then do
if oldvar + rxlv.disprows > displine.0 then topvar = displine.0 - (rxlv.disprows - 1)
else topvar = oldvar + 1
var = min(displine.0, topvar + (rxlv.disprows - 1))
call writech('listwin', rxlv.cls||getpage(topvar)||rxlv.nl||getlighty(row, var))
end
else do
var = (topvar + rxlv.disprows) - 1
call writech('listwin', getunlighty(oldrow, oldvar)||getlighty(row, var))
end
end
otherwise nop
end
end
when char = rxlv.esc then do
call close('listwin')
return 0
end
when char = rxlv.cr then do
call close('listwin')
return oldvar
end
otherwise nop
end
end
GETPAGE: procedure expose displine. rxlv.
parse arg topvar
if displine.0 = 1 then return ''
page = ''
do y = 1 to rxlv.disprows - 2 /* Lines between first and last */
page = page||displine.topvar||rxlv.nl
topvar = topvar + 1
end
page = page||displine.topvar /* No newline after last line */
return page
GETUNLIGHTY: procedure expose rxlv. displine.
parse arg row, var .
return rxlv.csi||row||';1H'||displine.var
GETLIGHTY: procedure expose rxlv. displine.
parse arg row, var .
return rxlv.csi||row||';1H'||rxlv.hilite||displine.var||rxlv.off
INIT_RXLISTVIEW: procedure expose rxlv.
/* Hardcoded minimum values */
rxlv.width = max(100, arg(1))
rxlv.height = max(50, arg(2))
/* ANSI stuff */
rxlv.csi = '9b'x ; rxlv.esc = '1b'x
rxlv.nl = '0a'x ; rxlv.cr = '0d'x
rxlv.off = rxlv.csi||'0m'
rxlv.topleft = rxlv.csi||'48'x
rxlv.cls = rxlv.csi||'H'||rxlv.csi'J'
rxlv.hilite = rxlv.csi||'43;32m'
rxlv.nowordwrap = rxlv.csi||'3f376c'x
rxlv.nocursor = rxlv.csi||'302070'x
rxlv.cursorup = '41'x ; rxlv.cursordown = '42'x
rxlv.scursorup = '54'x ; rxlv.scursordown = '53'x
/* GUI constants */
guiheight = 7 ; guiwidth = 8
/* Font info */
intui = showlist(l, 'intuition.library',, a)
call forbid
screen = next(intui, 56) /* IntuitionBase->ActiveScreen */
font = next(screen, 136) /* Screen->RastPort.Font */
fonty = c2d(import(offset(font, 20), 2)) /* Font->YSize */
fontx = c2d(import(offset(font, 24), 2)) /* Font->XSize */
call permit
/* Listview width */
do while (rxlv.width - guiwidth) // fontx ~= 0
rxlv.width = rxlv.width + 1
end
rxlv.dispcols = ((rxlv.width - guiwidth) % fontx)
/* Listview height */
const = guiheight + fonty
do while (rxlv.height - const) // fonty ~= 0
rxlv.height = rxlv.height + 1
end
rxlv.disprows = (rxlv.height - const) % fonty
/* We only need to do all this once */
rxlv.init? = 1
return